class Hello(object):
    def say_hello(self, name='world'):
        print('Hello, %s.' % name)


h = Hello()

# type()函数可以查看一个类型或变量的类型，Hello是一个class，它的类型就是type，而h是一个实例，它的类型就是class Hello。
# 我们说class的定义是运行时动态创建的，而创建class的方法就是使用type()函数。ype()函数既可以返回一个对象的类型，
# 又可以创建出新的类型，比如，我们可以通过type()函数创建出Hello类，而无需通过class Hello(object)...的定义：


def function_my(self, name="world"):
    print("Hello,%s" % name)


Hello_new = type("Hello_new", (object,), dict(hello_you=function_my))

hn = Hello_new()
hn.hello_you()
print(type(Hello_new))
print(type(hn))
# 要创建一个class对象，type()函数依次传入3个参数：
# 1、class的名称；
# 2、继承的父类集合，注意Python支持多重继承，如果只有一个父类，别忘了tuple的单元素写法；
# c3、lass的方法名称与函数绑定，这里我们把函数fn绑定到方法名hello上。


class ListMetaclass(type):
    # metaclass是类的模板，所以必须从`type`类型派生：
    def __new__(cls, name, bases, attrs):
        # __new__()方法接收到的参数依次是：当前准备创建的类的对象；类的名字；类继承的父类集合；类的方法集合。
        attrs['add'] = lambda self, value: self.append(value)
        return type.__new__(cls, name, bases, attrs)


class MyList(list, metaclass=ListMetaclass):
    pass


ll = MyList()
ll.add(1)
ll.add(2)
for l in ll:
    print(l)
